home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / e_os208 / example9 / mxmplay.asm < prev   
Assembly Source File  |  1996-05-21  |  49KB  |  2,791 lines

  1. ;// MXM player, (c) '95/96 Niklas Beisert / pascal
  2.  
  3. ;.386
  4. ;.model flat,prolog
  5. ;locals
  6. ;
  7. ;.data
  8.           db "cubic tiny gus xm player v1.3 (c) '95/96 Niklas Beisert / pascal"
  9.  
  10. mxmheader struc
  11.   hdMXMSig dd ?
  12.   hdNOrders dd ?
  13.   hdOrdLoopStart dd ?
  14.   hdNChannels dd ?
  15.   hdNPatterns dd ?
  16.   hdNInstruments dd ?
  17.   hdIniTempo db ?
  18.   hdIniBPM db ?
  19.   hdOptions dw ?
  20.   hdSampStart dd ?
  21.   hdSampMem8 dd ?
  22.   hdSampMem16 dd ?
  23.   hdPitchMin dd ?
  24.   hdPitchMax dd ?
  25.   hdPanPos db 32 dup (?)
  26.   hdOrderTable db 256 dup (?)
  27.   hdInstrTable dd 128 dup (?)
  28.   hdPatternTable dd 256 dup (?)
  29. ends
  30.  
  31. instrument struc
  32.   insNSamples dd ?
  33.   insSamples db 96 dup (?)
  34.   insVolFade dw ?
  35.   insVibType db ?
  36.   insVibSweep db ?
  37.   insVibDepth db ?
  38.   insVibRate db ?
  39.   insVNum db ?
  40.   insVSustain db ?
  41.   insVLoopS db ?
  42.   insVLoopE db ?
  43.   insVEnv dw 24 dup (?)
  44.   insPNum db ?
  45.   insPSustain db ?
  46.   insPLoopS db ?
  47.   insPLoopE db ?
  48.   insPEnv dw 24 dup (?)
  49.   db 46 dup (?)
  50. ends
  51.  
  52. sample struc
  53.   smpGUSStartPos db ?,?,?
  54.   smpGUSLoopPos db ?,?,?
  55.   smpGUSEndPos db ?,?,?
  56.   smpGUSMode db ?
  57.   smpDefVol db ?
  58.   smpDefPan db ?
  59.   smpNormNote dw ?
  60.   db ?,?
  61. ends
  62.  
  63.  
  64.  
  65.  
  66. channelsize = 256
  67. channel struc
  68.   chGUSInited db ?
  69.   chGUSStartPos dd ?
  70.   chGUSEndPos dd ?
  71.   chGUSLoopPos dd ?
  72.   chGUSMode db ?
  73.   chGUSStopIt db ?
  74.   chGUSChangeSamp db ?
  75.   chGUSNextPos dd ?
  76.   chGUSFrq dw ?
  77.   chGUSVol dw ?
  78.   chGUSPan db ?
  79.  
  80.   chVol db ?
  81.   chFinalVol db ?
  82.   chPan db ?
  83.   chFinalPan db ?
  84.   chPitch dd ?
  85.   chFinalPitch dd ?
  86.  
  87.   chCurIns db ?
  88.   chEnvIns dd ?
  89.   chCurNormNote dw ?
  90.   chSustain db ?
  91.   chFadeVol dw ?
  92.   chAVibPos db ?
  93.   chAVibSwpPos db ?
  94.   chVolEnvPos dd ?
  95.   chVolEnvSegPos dw ?
  96.   chPanEnvPos dd ?
  97.   chPanEnvSegPos dw ?
  98.  
  99.   chDefVol db ?
  100.   chDefPan db ?
  101.   chCommand db ?
  102.   chVCommand db ?
  103.   chPortaToPitch dd ?
  104.   chPortaToVal dd ?
  105.   chVolSlideVal db ?
  106.   chGVolSlideVal db ?
  107.   chVVolPanSlideVal db ?
  108.   chPanSlideVal db ?
  109.   chFineVolSlideUVal db ?
  110.   chFineVolSlideDVal db ?
  111.   chPortaUVal dd ?
  112.   chPortaDVal dd ?
  113.   chFinePortaUVal db ?
  114.   chFinePortaDVal db ?
  115.   chXFinePortaUVal db ?
  116.   chXFinePortaDVal db ?
  117.   chVibRate db ?
  118.   chVibPos db ?
  119.   chVibType db ?
  120.   chVibDep db ?
  121.   chTremRate db ?
  122.   chTremPos db ?
  123.   chTremType db ?
  124.   chTremDep db ?
  125.   chPatLoopCount db ?
  126.   chPatLoopStart db ?
  127.   chArpPos db ?
  128.   chArpNotes db ?,?,?
  129.   chActionTick db ?
  130.   chMRetrigPos db ?
  131.   chMRetrigLen db ?
  132.   chMRetrigAct db ?
  133.   chDelayNote db ?
  134.   chOffset db ?
  135.   chGlissando db ?
  136.   chTremorPos db ?
  137.   chTremorLen db ?
  138.   chTremorOff db ?
  139. ends
  140.  
  141. globaldatastruct struc
  142.   globalvol db ?
  143.   uservol db ?
  144.   syncval db ?
  145.  
  146.   curtick db ?
  147.   curtempo db ?
  148.   tick0 db ?
  149.  
  150.   currow dd ?
  151.   patptr dd ?
  152.   patlen dd ?
  153.  
  154.   curord dd ?
  155.  
  156.   jumptoord dd ?
  157.   jumptorow dd ?
  158.   patdelay db ?
  159.  
  160.   procnot db ?
  161.   procins db ?
  162.   procvol db ?
  163.   proccmd db ?
  164.   procdat db ?
  165.   notedelayed db ?
  166.  
  167.   tmOldTimer df ?
  168.   tmOldSSESP df ?
  169.   tmIntCount dd ?
  170.   tmTimerRate dd ?
  171.   tmTicker dd ?
  172.   tmInRoutine dd ?
  173.   stimerlen dd ?
  174.   stimerpos dd ?
  175.   datasegsel dw ?
  176.   maxtimerrate dd ?
  177.  
  178.   gusport dd ?
  179.   guschannels dd ?
  180.  
  181.   portatmp db ?
  182.  
  183.   head mxmheader ?
  184.  
  185.   guslinvol dw 257 dup (?)
  186.  
  187.   chandata db channelsize*32 dup (?)
  188.  
  189.   tmStack db 1024 dup (?)
  190.  
  191.   vibtabs db 1024 dup (?)
  192. ends
  193.  
  194. ;//.data?
  195. ;//globdat globaldatastruct ?
  196.  
  197.  
  198. ;.code
  199.  
  200. globdatptr dd 0
  201.  
  202. ;//*************************************************************************
  203. ;// XM player
  204.  
  205. loadebp proc
  206. ;//  lea ebp,globdat  ;// would cause a relocation
  207.   call @@getadr
  208. @@getadr:
  209.   pop ebp
  210.   mov ebp,cs:[ebp+globdatptr-@@getadr]
  211.   ret
  212. endp
  213.  
  214. inittables proc
  215.   call @@getadr
  216. @@getadr:
  217.   pop esi
  218.   add esi,sintab-@@getadr
  219.   lea edi,[ebp].vibtabs
  220.   mov ecx,16
  221.   rep movsd
  222.   mov al,64
  223.   stosb
  224.   mov cl,63
  225. @@sintabloop1:
  226.     dec esi
  227.     mov al,[esi]
  228.     stosb
  229.   dec cl
  230.   jnz @@sintabloop1
  231.   lea esi,[ebp].vibtabs
  232.   mov cl,128
  233. @@sintabloop2:
  234.     lodsb
  235.     neg al
  236.     stosb
  237.   dec cl
  238.   jnz @@sintabloop2
  239.  
  240. @@dwntabloop:
  241.     mov al,cl
  242.     sar al,1
  243.     neg al
  244.     stosb
  245.   dec cl
  246.   jnz @@dwntabloop
  247.  
  248. @@rectabloop:
  249.     mov al,cl
  250.     and al,80h
  251.     sub al,40h
  252.     stosb
  253.   dec cl
  254.   jnz @@rectabloop
  255.  
  256. @@uptabloop:
  257.     mov al,cl
  258.     sar al,1
  259.     stosb
  260.   dec cl
  261.   jnz @@uptabloop
  262.  
  263.   mov [ebp].guslinvol[0],0
  264.   mov [ebp].guslinvol[512],0EFFFh
  265.  
  266.   mov edi,1
  267. @@lintabloop:
  268.     mov ebx,edi
  269.     mov edx,7
  270.   @@logloop:
  271.     cmp ebx,0
  272.     je @@logfound
  273.       shr ebx,1
  274.       inc edx
  275.     jmp @@logloop
  276.   @@logfound:
  277.     mov eax,edi
  278.     mov cl,20
  279.     sub cl,dl
  280.     shl eax,cl
  281.     and eax,0fffh
  282.     shl edx,12
  283.     or eax,edx
  284.     sub eax,1000h
  285.     mov [ebp].guslinvol[2*edi],ax
  286.   inc edi
  287.   cmp edi,256
  288.   jne @@lintabloop
  289.  
  290.   ret
  291. endp
  292.  
  293.  
  294. public xmpInit_
  295. xmpInit_ proc ;// esi:mxmdata, ecx:maxtimerrate, eax:pspseg, ebx:globdat
  296.   push ebp
  297.  
  298. ;//  lea ebx,globdat
  299.   call @@getadr
  300. @@getadr:
  301.   pop ebp
  302.   mov [ebp+globdatptr-@@getadr],ebx
  303.   mov ebp,ebx
  304.   mov ebx,4000h
  305. @@inilp:
  306.     dec ebx
  307.     mov byte ptr [ebp+ebx],0
  308.   jnz @@inilp
  309.  
  310.   mov [ebp].maxtimerrate,ecx
  311.   mov [ebp].uservol,40h
  312.  
  313.   test eax,80000000h
  314.   jnz @@portgiven
  315.     call gusGetPort
  316. @@portgiven:
  317.   and eax,not 80000000h
  318.   mov [ebp].gusport,eax
  319.  
  320.   cmp [esi].hdMXMSig,004D584Dh
  321.   jne @@fail
  322.  
  323.   lea edi,[ebp].head.hdMXMSig
  324.   mov ecx,750h/4
  325.   rep movsd
  326.  
  327.   sub esi,750h
  328.   sub edi,600h
  329.   mov ecx,180h
  330. @@relloop:
  331.     add [edi],esi
  332.     add edi,4
  333.   dec ecx
  334.   jnz @@relloop
  335.  
  336.  
  337.   test byte ptr [esi].hdOptions,4
  338.   jz @@nodelta
  339.     and byte ptr [esi].hdOptions,not 4
  340.  
  341.     mov ecx,[esi].hdSampMem8
  342.     mov ebx,[esi].hdSampStart
  343.     add ebx,esi
  344.     xor eax,eax
  345.     cmp ecx,0
  346.     je @@8bitfini
  347.   @@8bitdelta:
  348.       add al,[ebx]
  349.       mov [ebx],al
  350.       inc ebx
  351.     dec ecx
  352.     jnz @@8bitdelta
  353.   @@8bitfini:
  354.     mov ecx,[esi].hdSampMem16
  355.     xor eax,eax
  356.     cmp ecx,0
  357.     je @@16bitfini
  358.   @@16bitdelta:
  359.       add ax,[ebx]
  360.       mov [ebx],ax
  361.       add ebx,2
  362.     dec ecx
  363.     jnz @@16bitdelta
  364.   @@16bitfini:
  365. @@nodelta:
  366.  
  367.   mov ecx,[esi].hdSampMem16
  368.   shl ecx,1
  369.   add ecx,[esi].hdSampMem8
  370.   mov eax,[esi].hdSampStart
  371.   add esi,eax
  372.  
  373.   call gusUploadSamples
  374.   call inittables
  375.  
  376.   mov eax,1
  377.   jmp @@done
  378.  
  379. @@fail:
  380.   xor eax,eax
  381. @@done:
  382.  
  383.   pop ebp
  384.   ret
  385. endp
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392. getfreq6848:
  393.             push ebx
  394.             push ecx
  395.             push edx
  396.             push esi
  397.   add eax,8000h
  398.   mov edx,eax
  399.   mov ebx,eax
  400.   mov ecx,eax
  401.   shr eax,12
  402.   shr edx,8
  403.   shr ebx,4
  404.   and eax,15
  405.   and ebx,15
  406.   and ecx,15
  407.   and edx,15
  408.   call @@getadr
  409. @@getadr:
  410.   pop esi
  411.   add esi,logfreqtab-@@getadr
  412.   mov eax,[esi+6*16+eax*4]
  413.   movzx edx,word ptr [esi+4*16+edx*2]
  414.   movzx ebx,word ptr [esi+2*16+ebx*2]
  415.   movzx ecx,word ptr [esi+0*16+ecx*2]
  416.   mul edx
  417.   shrd eax,edx,15
  418.   mul ebx
  419.   shrd eax,edx,15
  420.   mul ecx
  421.   shrd eax,edx,15
  422.             pop esi
  423.             pop edx
  424.             pop ecx
  425.             pop ebx
  426.   ret
  427. endp
  428.  
  429.  
  430.  
  431.  
  432. PlayNote proc
  433.   mov [ebp].portatmp,0
  434.  
  435.   cmp [ebp].proccmd,3
  436.   jne @@noportac
  437.     mov [ebp].portatmp,1
  438. @@noportac:
  439.   cmp [ebp].proccmd,5
  440.   jne @@noportacv
  441.     mov [ebp].portatmp,1
  442. @@noportacv:
  443.   cmp [ebp].procvol,0f0h
  444.   jb @@noportav
  445.     mov [ebp].portatmp,1
  446. @@noportav:
  447.  
  448.   cmp [ebp].procnot,97
  449.   jne @@nokeyoff
  450.     mov [edi].chSustain,0
  451.     mov [ebp].procnot,0
  452. @@nokeyoff:
  453.  
  454.   movzx eax,[ebp].procins
  455.   cmp al,0
  456.   je @@noins1
  457.   cmp eax,[ebp].head.hdNInstruments
  458.   ja @@noins1
  459.     mov [edi].chCurIns,al
  460. @@noins1:
  461.   cmp [edi].chCurIns,0
  462.   je @@done
  463.  
  464.   movzx eax,[ebp].procnot
  465.   cmp al,0
  466.   je @@nonote
  467.     cmp [ebp].procins,0
  468.     je @@nohit
  469.       mov [edi].chSustain,1
  470.   @@nohit:
  471.  
  472.     mov [edi].chDelayNote,al
  473.     cmp [ebp].proccmd,49
  474.     jne @@nodelay
  475.       cmp [ebp].procdat,0
  476.       jne @@done
  477.   @@nodelay:
  478.  
  479.     dec al
  480.     cmp [ebp].portatmp,1
  481.     je @@portanote
  482.       mov [edi].chGUSStopIt,1
  483.  
  484.       movzx edx,[edi].chCurIns
  485.       dec dl
  486.       mov edx,[ebp].head.hdInstrTable[4*edx]
  487.       movzx ebx,insSamples[edx][eax]
  488.       cmp ebx,insNSamples[edx]
  489.       jae @@done
  490.       shl ebx,4
  491.       lea ebx,[ebx+edx+256]
  492.  
  493.       mov [edi].chGUSInited,1
  494.       mov [edi].chGUSChangeSamp,1
  495.  
  496.       push eax
  497.       mov eax,dword ptr [ebx].smpGUSStartPos
  498.       and eax,0ffffffh
  499.       mov [edi].chGUSStartPos,eax
  500.       mov eax,dword ptr [ebx].smpGUSLoopPos
  501.       and eax,0ffffffh
  502.       mov [edi].chGUSLoopPos,eax
  503.       mov eax,dword ptr [ebx].smpGUSEndPos
  504.       and eax,0ffffffh
  505.       mov [edi].chGUSEndPos,eax
  506.       mov al,[ebx].smpGUSMode
  507.       mov [edi].chGUSMode,al
  508.       pop eax
  509.  
  510.       cmp [ebp].procins,0
  511.       je @@noins2
  512.         mov [edi].chEnvIns,edx
  513.         mov dl,[ebx].smpDefVol
  514.         mov [edi].chDefVol,dl
  515.         mov dl,[ebx].smpDefPan
  516.         mov [edi].chDefPan,dl
  517.     @@noins2:
  518.  
  519.       mov dx,[ebx].smpNormNote
  520.       mov [edi].chCurNormNote,dx
  521.  
  522. ;// process finetune here (proccmd==41)
  523. ;// overwrite top 4 bits of instrument finetune value
  524. ;// cannot do this correctly, since conversion reduced information... :(
  525. ;// this command sucks anyway!!!
  526.  
  527.       shl eax,8
  528.       add ax,dx
  529.       neg ax
  530.       add ah,48
  531.       movsx eax,ax
  532.       test byte ptr [ebp].head.hdOptions,1
  533.       jnz @@line1
  534.         neg eax
  535.         call getfreq6848
  536.     @@line1:
  537.       mov [edi].chPitch,eax
  538.       mov [edi].chFinalPitch,eax
  539.       mov [edi].chPortaToPitch,eax
  540.  
  541.       xor eax,eax
  542.       cmp [ebp].proccmd,9
  543.       jne @@nooffset
  544.         mov al,[ebp].procdat
  545.         cmp al,0
  546.         je @@reuseoffset
  547.           mov [edi].chOffset,al
  548.       @@reuseoffset:
  549.         movzx eax,[edi].chOffset
  550.         shl eax,8
  551.     @@nooffset:
  552.  
  553.       mov [edi].chGUSNextPos,eax
  554.       mov [edi].chVibPos,0
  555.       mov [edi].chTremPos,0
  556.       mov [edi].chArpPos,0
  557.       mov [edi].chMRetrigPos,0
  558.       mov [edi].chTremorPos,0
  559.       jmp @@nonote
  560.  
  561.   @@portanote:
  562.       shl eax,8
  563.       add ax,[edi].chCurNormNote
  564.       neg ax
  565.       add ah,48
  566.       movsx eax,ax
  567.       test byte ptr [ebp].head.hdOptions,1
  568.       jnz @@line2
  569.         neg eax
  570.         call getfreq6848
  571.     @@line2:
  572.       mov [edi].chPortaToPitch,eax
  573. @@nonote:
  574.  
  575.   cmp [edi].chSustain,0
  576.   je @@done
  577.   cmp [ebp].procins,0
  578.   je @@done
  579.     cmp [ebp].notedelayed,1
  580.     je @@noinsvolpan
  581.       mov al,[edi].chDefVol
  582.       mov [edi].chVol,al
  583.       mov [edi].chFinalVol,al
  584.       test byte ptr [ebp].head.hdOptions,2
  585.       jnz @@noinsvolpan
  586.       mov al,[edi].chDefPan
  587.       mov [edi].chPan,al
  588.       mov [edi].chFinalPan,al
  589.   @@noinsvolpan:
  590.     xor eax,eax
  591.     mov [edi].chFadeVol,8000h
  592.     mov [edi].chAVibPos,al
  593.     mov [edi].chAVibSwpPos,al
  594.     mov [edi].chVolEnvPos,eax
  595.     mov [edi].chVolEnvSegPos,ax
  596.     mov [edi].chPanEnvPos,eax
  597.     mov [edi].chPanEnvSegPos,ax
  598.  
  599. @@done:
  600.   ret
  601. endp
  602.  
  603. public xmpSetVolume_
  604. xmpSetVolume_ proc
  605.   push ebp
  606.   call loadebp
  607.   mov [ebp].uservol,al
  608.   pop ebp
  609.   ret
  610. endp
  611.  
  612. public xmpGetSync_
  613. xmpGetSync_ proc
  614.   push ebp
  615.   call loadebp
  616.   mov al,[ebp].syncval
  617.   pop ebp
  618.   ret
  619. endp
  620.  
  621. public xmpGetPos_
  622. xmpGetPos_ proc
  623.   push ebp
  624.   call loadebp
  625.   mov al,byte ptr [ebp].currow
  626.   mov ah,byte ptr [ebp].curord
  627.   pop ebp
  628.   ret
  629. endp
  630.  
  631.  
  632.  
  633.  
  634. freqrange proc
  635.   cmp eax,[ebp].head.hdPitchMin
  636.   jg @@lowlimok
  637.     mov eax,[ebp].head.hdPitchMin
  638. @@lowlimok:
  639.   cmp eax,[ebp].head.hdPitchMax
  640.   jl @@highlimok
  641.     mov eax,[ebp].head.hdPitchMax
  642.   jmp @@highlimok
  643. @@highlimok:
  644.   ret
  645. endp
  646.  
  647.  
  648. ;//***************************************************************************
  649. ;//effects
  650.  
  651. procnothing proc
  652.   ret
  653. endp
  654.  
  655. procjump proc
  656.   movzx eax,[ebp].procdat
  657.   mov [ebp].jumptoord,eax
  658.   mov [ebp].jumptorow,0
  659.   ret
  660. endp
  661.  
  662. procbreak proc
  663.   cmp [ebp].jumptoord,-1
  664.   jne @@onlyrow
  665.     mov eax,[ebp].curord
  666.     inc eax
  667.     mov [ebp].jumptoord,eax
  668. @@onlyrow:
  669.   movzx eax,[ebp].procdat
  670.   mov ebx,eax
  671.   shr al,4
  672.   imul eax,10
  673.   and bl,0fh
  674.   add eax,ebx
  675.   mov [ebp].jumptorow,eax
  676.   ret
  677. endp
  678.  
  679. procpatloop proc
  680.   mov al,[ebp].procdat
  681.   cmp al,0
  682.   je @@set
  683.     inc [edi].chPatLoopCount
  684.     cmp [edi].chPatLoopCount,al
  685.     ja @@nextrow
  686.       movzx eax,[edi].chPatLoopStart
  687.       mov [ebp].jumptorow,eax
  688.       mov eax,[ebp].curord
  689.       mov [ebp].jumptoord,eax
  690.     jmp @@done
  691.   @@nextrow:
  692.       mov [edi].chPatLoopCount,0
  693.       mov al,byte ptr [ebp].currow
  694.       inc al
  695.       mov [edi].chPatLoopStart,al
  696.     jmp @@done
  697. @@set:
  698.   mov al,byte ptr [ebp].currow
  699.   mov [edi].chPatLoopStart,al
  700. @@done:
  701.   ret
  702. endp
  703.  
  704. procpatdelay proc
  705.   mov al,[ebp].procdat
  706.   mov [ebp].patdelay,al
  707.   ret
  708. endp
  709.  
  710. proctempo proc
  711.   movzx ebx,[ebp].procdat
  712.   cmp bl,20h
  713.   jb @@speed
  714.     mov eax,2983615
  715.     xor edx,edx
  716.     div ebx
  717.     mov [ebp].stimerlen,eax
  718.     ret
  719. @@speed:
  720.     cmp bl,0
  721.     je @@ignore
  722.     mov [ebp].curtempo,bl
  723. @@ignore:
  724.   ret
  725. endp
  726.  
  727. procnvol proc
  728.   mov al,[ebp].procdat
  729.   cmp al,40h
  730.   jbe @@vok
  731.     mov al,40h
  732. @@vok:
  733.   mov [edi].chVol,al
  734.   mov [edi].chFinalVol,al
  735.   ret
  736. endp
  737.  
  738. procgvol proc
  739.   mov al,[ebp].procdat
  740.   cmp al,40h
  741.   jbe @@vok
  742.     mov al,40h
  743. @@vok:
  744.   mov [ebp].globalvol,al
  745.   ret
  746. endp
  747.  
  748. procpan proc
  749.   mov al,[ebp].procdat
  750.   mov [edi].chPan,al
  751.   mov [edi].chFinalPan,al
  752.   ret
  753. endp
  754.  
  755. procspan proc
  756.   mov al,[ebp].procdat
  757.   shl al,4
  758.   or al,[ebp].procdat
  759.   mov [edi].chPan,al
  760.   mov [edi].chFinalPan,al
  761.   ret
  762. endp
  763.  
  764. procvpan proc
  765.   mov al,[ebp].procvol
  766.   shl al,4
  767.   or al,[ebp].procvol
  768.   mov [edi].chPan,al
  769.   mov [edi].chFinalPan,al
  770.   ret
  771. endp
  772.  
  773. procarpeggio proc
  774.   movzx eax,[ebp].procdat
  775.   cmp al,0
  776.   jne @@doit
  777.     mov [edi].chCommand,0ffh
  778. @@doit:
  779.   shl eax,4
  780.   shr al,4
  781.   mov [edi].chArpNotes[0],0
  782.   mov [edi].chArpNotes[1],ah
  783.   mov [edi].chArpNotes[2],al
  784.   ret
  785. endp
  786.  
  787.  
  788. procportau proc
  789.   movzx eax,[ebp].procdat
  790.   cmp al,0
  791.   je @@reuse
  792.     shl eax,4
  793.     mov [edi].chPortaUVal,eax
  794. @@reuse:
  795.   ret
  796. endp
  797.  
  798. procportad proc
  799.   movzx eax,[ebp].procdat
  800.   cmp al,0
  801.   je @@reuse
  802.     shl eax,4
  803.     mov [edi].chPortaDVal,eax
  804. @@reuse:
  805.   ret
  806. endp
  807.  
  808. procportanote proc
  809.   movzx eax,[ebp].procdat
  810.   cmp al,0
  811.   je @@reuse
  812.     shl eax,4
  813.     mov [edi].chPortaToVal,eax
  814. @@reuse:
  815.   ret
  816. endp
  817.  
  818. procvibrato proc
  819.   mov al,[ebp].procdat
  820.   and al,0Fh
  821.   jz @@reusel
  822.     shl al,2
  823.     mov [edi].chVibDep,al
  824. @@reusel:
  825.   mov al,[ebp].procdat
  826.   and al,0F0h
  827.   jz @@reuseh
  828.     shr al,2
  829.     mov [edi].chVibRate,al
  830. @@reuseh:
  831.   ret
  832. endp
  833.  
  834. proctremolo proc
  835.   mov al,[ebp].procdat
  836.   and al,0Fh
  837.   jz @@reusel
  838.     shl al,2
  839.     mov [edi].chTremDep,al
  840. @@reusel:
  841.   mov al,[ebp].procdat
  842.   and al,0F0h
  843.   jz @@reuseh
  844.     shr al,2
  845.     mov [edi].chTremRate,al
  846. @@reuseh:
  847.   ret
  848. endp
  849.  
  850. procvolsl proc
  851.   mov al,[ebp].procdat
  852.   cmp al,0
  853.   je @@reuse
  854.     mov [edi].chVolSlideVal,al
  855. @@reuse:
  856.   ret
  857. endp
  858.  
  859. procpansl proc
  860.   mov al,[ebp].procdat
  861.   cmp al,0
  862.   je @@reuse
  863.     mov [edi].chPanSlideVal,al
  864. @@reuse:
  865.   ret
  866. endp
  867.  
  868. procgvolsl proc
  869.   mov al,[ebp].procdat
  870.   cmp al,0
  871.   je @@reuse
  872.     mov [edi].chGVolSlideVal,al
  873. @@reuse:
  874.   ret
  875. endp
  876.  
  877.  
  878. procfportau proc
  879.   mov al,[ebp].procdat
  880.   cmp al,0
  881.   je @@reuse
  882.     mov [edi].chFinePortaUVal,al
  883. @@reuse:
  884.   movzx eax,[edi].chFinePortaUVal
  885.   shl eax,4
  886.   neg eax
  887.   add eax,[edi].chPitch
  888.   call freqrange
  889.   mov [edi].chPitch,eax
  890.   mov [edi].chFinalPitch,eax
  891.   ret
  892. endp
  893.  
  894. procfportad proc
  895.   mov al,[ebp].procdat
  896.   cmp al,0
  897.   je @@reuse
  898.     mov [edi].chFinePortaDVal,al
  899. @@reuse:
  900.   movzx eax,[edi].chFinePortaDVal
  901.   shl eax,4
  902.   add eax,[edi].chPitch
  903.   call freqrange
  904.   mov [edi].chPitch,eax
  905.   mov [edi].chFinalPitch,eax
  906.   ret
  907. endp
  908.  
  909. procxfporta proc
  910.   movzx eax,[ebp].procdat
  911.   shl eax,4
  912.   shr al,4
  913.   cmp ah,2
  914.   je @@down
  915.   cmp ah,1
  916.   jne @@done
  917.  
  918.     cmp al,0
  919.     je @@reuseu
  920.       mov [edi].chXFinePortaUVal,al
  921.   @@reuseu:
  922.     movzx eax,[edi].chXFinePortaUVal
  923.     shl eax,2
  924.     neg eax
  925.     add eax,[edi].chPitch
  926.     call freqrange
  927.     mov [edi].chPitch,eax
  928.     mov [edi].chFinalPitch,eax
  929.   jmp @@done
  930.  
  931. @@down:
  932.     cmp al,0
  933.     je @@reused
  934.       mov [edi].chXFinePortaDVal,al
  935.   @@reused:
  936.     movzx eax,[edi].chXFinePortaDVal
  937.     shl eax,2
  938.     add eax,[edi].chPitch
  939.     call freqrange
  940.     mov [edi].chPitch,eax
  941.     mov [edi].chFinalPitch,eax
  942.  
  943. @@done:
  944.   ret
  945. endp
  946.  
  947.  
  948.  
  949. procfvolup proc
  950.   mov al,[ebp].procdat
  951.   cmp al,0
  952.   je @@reuse
  953.     mov [edi].chFineVolSlideUVal,al
  954. @@reuse:
  955.   mov al,[edi].chVol
  956.   add al,[edi].chFineVolSlideUVal
  957.   cmp al,40h
  958.   jbe @@vok
  959.     mov al,40h
  960. @@vok:
  961.   mov [edi].chVol,al
  962.   mov [edi].chFinalVol,al
  963.   ret
  964. endp
  965.  
  966. procfvoldn proc
  967.   mov al,[ebp].procdat
  968.   cmp al,0
  969.   je @@reuse
  970.     mov [edi].chFineVolSlideDVal,al
  971. @@reuse:
  972.   mov al,[edi].chVol
  973.   sub al,[edi].chFineVolSlideDVal
  974.   jnc @@vok
  975.     mov al,0
  976. @@vok:
  977.   mov [edi].chVol,al
  978.   mov [edi].chFinalVol,al
  979.   ret
  980. endp
  981.  
  982. proctick proc
  983.   mov al,[ebp].procdat
  984.   mov [edi].chActionTick,al
  985.   ret
  986. endp
  987.  
  988.  
  989. procvvol proc
  990. procvvol4:
  991.   mov [ebp].procvol,10h
  992. procvvol3:
  993.   add [ebp].procvol,10h
  994. procvvol2:
  995.   add [ebp].procvol,10h
  996. procvvol1:
  997.   add [ebp].procvol,10h
  998. procvvol0:
  999.   mov al,[ebp].procvol
  1000.   mov [edi].chVol,al
  1001.   mov [edi].chFinalVol,al
  1002.   ret
  1003. endp
  1004.  
  1005. procvvpsl proc
  1006.   mov al,[ebp].procvol
  1007.   mov [edi].chVVolPanSlideVal,al
  1008.   ret
  1009. endp
  1010.  
  1011. procvfvolup proc
  1012.   mov al,[edi].chVol
  1013.   add al,[ebp].procvol
  1014.   cmp al,40h
  1015.   jbe @@vok
  1016.     mov al,40h
  1017. @@vok:
  1018.   mov [edi].chVol,al
  1019.   mov [edi].chFinalVol,al
  1020.   ret
  1021. endp
  1022.  
  1023. procvfvoldn proc
  1024.   mov al,[edi].chVol
  1025.   sub al,[ebp].procvol
  1026.   jnc @@vok
  1027.     mov al,0
  1028. @@vok:
  1029.   mov [edi].chVol,al
  1030.   mov [edi].chFinalVol,al
  1031.   ret
  1032. endp
  1033.  
  1034. procvvibrat proc
  1035.   mov al,[ebp].procvol
  1036.   shl al,2
  1037.   je @@reuse
  1038.     mov [edi].chVibRate,al
  1039. @@reuse:
  1040.   ret
  1041. endp
  1042.  
  1043. procvvib proc
  1044.   mov al,[ebp].procvol
  1045.   shl al,2
  1046.   je @@reuse
  1047.     mov [edi].chVibDep,al
  1048. @@reuse:
  1049.   ret
  1050. endp
  1051.  
  1052. procmretrig proc
  1053.   movzx eax,[ebp].procdat
  1054.   cmp al,0
  1055.   je @@reuse
  1056.     shl eax,4
  1057.     shr al,4
  1058.     mov [edi].chMRetrigLen,al
  1059.     mov [edi].chMRetrigAct,ah
  1060.     mov [edi].chMRetrigPos,0
  1061. @@reuse:
  1062.   ret
  1063. endp
  1064.  
  1065. procvportanote proc
  1066.   movzx eax,[ebp].procvol
  1067.   cmp al,0
  1068.   je @@reuse
  1069.     shl eax,8
  1070.     mov [edi].chPortaToVal,eax
  1071. @@reuse:
  1072.   ret
  1073. endp
  1074.  
  1075. procvibtype proc
  1076.   mov al,[ebp].procdat
  1077.   and al,3
  1078.   mov [edi].chVibType,al
  1079.   ret
  1080. endp
  1081.  
  1082. proctremtype proc
  1083.   mov al,[ebp].procdat
  1084.   and al,3
  1085.   mov [edi].chTremType,al
  1086.   ret
  1087. endp
  1088.  
  1089. procsync proc
  1090.   mov al,[ebp].procdat
  1091.   mov [ebp].syncval,al
  1092.   ret
  1093. endp
  1094.  
  1095. procgliss proc
  1096.   mov al,[ebp].procdat
  1097.   mov [edi].chGlissando,al
  1098.   ret
  1099. endp
  1100.  
  1101. proctremor proc
  1102.   movzx eax,[ebp].procdat
  1103.   cmp al,0
  1104.   je @@reuse
  1105.     shl eax,4
  1106.     shr al,4
  1107.     inc al
  1108.     inc ah
  1109.     add al,ah
  1110.     mov [edi].chTremorLen,al
  1111.     mov [edi].chTremorOff,ah
  1112.     mov [edi].chTremorPos,0
  1113. @@reuse:
  1114.   ret
  1115. endp
  1116.  
  1117. procenvpos proc
  1118.   cmp [edi].chEnvIns,0
  1119.   je @@noenvins
  1120.   mov ebx,[edi].chEnvIns
  1121.  
  1122.   xor eax,eax
  1123.   movzx edx,[ebp].procdat
  1124.   jmp @@venvloops
  1125. @@venvloop:
  1126.     sub dx,[ebx].insVEnv[4*eax]
  1127.     jb @@venvok
  1128.     inc eax
  1129. @@venvloops:
  1130.   cmp al,[ebx].insVNum
  1131.   jne @@venvloop
  1132.   xor edx,edx
  1133.   sub dx,[ebx].insVEnv[4*eax]
  1134. @@venvok:
  1135.   add dx,[ebx].insVEnv[4*eax]
  1136.   mov [edi].chVolEnvPos,eax
  1137.   mov [edi].chVolEnvSegPos,dx
  1138.  
  1139.   xor eax,eax
  1140.   movzx edx,[ebp].procdat
  1141.   jmp @@penvloops
  1142. @@penvloop:
  1143.     sub dx,[ebx].insPEnv[4*eax]
  1144.     jb @@penvok
  1145.     inc eax
  1146. @@penvloops:
  1147.   cmp al,[ebx].insPNum
  1148.   jne @@venvloop
  1149.   xor edx,edx
  1150.   sub dx,[ebx].insPEnv[4*eax]
  1151. @@penvok:
  1152.   add dx,[ebx].insPEnv[4*eax]
  1153.   mov [edi].chPanEnvPos,eax
  1154.   mov [edi].chPanEnvSegPos,dx
  1155.  
  1156. @@noenvins:
  1157.   ret
  1158. endp
  1159.  
  1160.  
  1161. doarpeggio proc
  1162.   movzx eax,[edi].chArpPos
  1163.   mov al,[edi].chArpNotes[eax]
  1164.   test byte ptr [ebp].head.hdOptions,1
  1165.   je @@amiga
  1166.     shl eax,8
  1167.     neg eax
  1168.     add eax,[edi].chFinalPitch
  1169.     call freqrange
  1170.     mov [edi].chFinalPitch,eax
  1171.   jmp @@noamiga
  1172.  
  1173. @@amiga:
  1174.     call @@getadr
  1175.   @@getadr:
  1176.     pop edx
  1177.     mov ax,[edx+logfreqtab[16*4+eax*2]-@@getadr]
  1178.     mul [edi].chFinalPitch
  1179.     shrd eax,edx,15
  1180.     call freqrange
  1181.     mov [edi].chFinalPitch,eax
  1182.  
  1183. @@noamiga:
  1184.   inc [edi].chArpPos
  1185.   cmp [edi].chArpPos,3
  1186.   jne @@done
  1187.     mov [edi].chArpPos,0
  1188. @@done:
  1189.   ret
  1190. endp
  1191.  
  1192. doportau proc
  1193.   cmp [ebp].tick0,0
  1194.   jne @@done
  1195.   mov eax,[edi].chPitch
  1196.   sub eax,[edi].chPortaUVal
  1197.   call freqrange
  1198.   mov [edi].chPitch,eax
  1199.   mov [edi].chFinalPitch,eax
  1200. @@done:
  1201.   ret
  1202. endp
  1203.  
  1204. doportad proc
  1205.   cmp [ebp].tick0,0
  1206.   jne @@done
  1207.   mov eax,[edi].chPitch
  1208.   add eax,[edi].chPortaDVal
  1209.   call freqrange
  1210.   mov [edi].chPitch,eax
  1211.   mov [edi].chFinalPitch,eax
  1212. @@done:
  1213.   ret
  1214. endp
  1215.  
  1216. doportanote proc
  1217.   mov eax,[edi].chPitch
  1218.   cmp [ebp].tick0,0
  1219.   jne @@set
  1220.   cmp eax,[edi].chPortaToPitch
  1221.   je @@set
  1222.   jg @@down
  1223.     add eax,[edi].chPortaToVal
  1224.     cmp eax,[edi].chPortaToPitch
  1225.     jle @@set
  1226.     mov eax,[edi].chPortaToPitch
  1227.     jmp @@set
  1228. @@down:
  1229.     sub eax,[edi].chPortaToVal
  1230.     cmp eax,[edi].chPortaToPitch
  1231.     jge @@set
  1232.     mov eax,[edi].chPortaToPitch
  1233. @@set:
  1234.   mov [edi].chPitch,eax
  1235.   cmp [edi].chGlissando,0
  1236.   je @@setfinpitch
  1237.     test byte ptr [ebp].head.hdOptions,1
  1238.     jz @@amiga
  1239.       movzx ebx,[edi].chCurNormNote
  1240.       add eax,ebx
  1241.       add eax,80h
  1242.       xor al,al
  1243.       sub eax,ebx
  1244.       jmp @@setfinpitch
  1245.   @@amiga:
  1246.       mov edx,eax ;// search for closest note
  1247.       mov ebx,eax ;// how should i do it??
  1248.       push ecx
  1249.       mov ecx,-1
  1250.       mov eax,-48*256
  1251.     @@aloop:
  1252.         push eax
  1253.         add ax,[edi].chCurNormNote
  1254.         movsx eax,ax
  1255.         call getfreq6848
  1256.         sub eax,edx
  1257.         jae @@apos
  1258.           neg eax
  1259.       @@apos:
  1260.         cmp eax,ecx
  1261.         jae @@aold
  1262.           mov ecx,eax
  1263.           mov eax,[esp]
  1264.           add ax,[edi].chCurNormNote
  1265.           movsx eax,ax
  1266.           call getfreq6848
  1267.           mov ebx,eax
  1268.       @@aold:
  1269.         pop eax
  1270.       inc ah
  1271.       cmp ah,48
  1272.       jne @@aloop
  1273.       pop ecx
  1274.       mov eax,ebx
  1275. @@setfinpitch:
  1276.   mov [edi].chFinalPitch,eax
  1277. @@done:
  1278.   ret
  1279. endp
  1280.  
  1281. dovibrato proc
  1282.   movzx eax,word ptr [edi].chVibPos
  1283.   movsx eax,[ebp].vibtabs[eax]
  1284.   imul [edi].chVibDep
  1285.   sar eax,3
  1286.   add eax,[edi].chFinalPitch
  1287.   call freqrange
  1288.   mov [edi].chFinalPitch,eax
  1289.  
  1290.   cmp [ebp].tick0,0
  1291.   jne @@done
  1292.   mov al,[edi].chVibRate
  1293.   add [edi].chVibPos,al
  1294. @@done:
  1295.   ret
  1296. endp
  1297.  
  1298. dotremolo proc
  1299.   movzx eax,word ptr [edi].chTremPos
  1300.   movsx eax,[ebp].vibtabs[eax]
  1301.   imul [edi].chTremDep
  1302.   sar eax,6
  1303.   add al,[edi].chFinalVol
  1304.   jns @@lok
  1305.     mov al,0
  1306. @@lok:
  1307.   cmp al,40h
  1308.   jbe @@tok
  1309.     mov al,40h
  1310. @@tok:
  1311.   mov [edi].chFinalVol,al
  1312.  
  1313.   cmp [ebp].tick0,0
  1314.   jne @@done
  1315.   mov al,[edi].chTremRate
  1316.   add [edi].chTremPos,al
  1317. @@done:
  1318.   ret
  1319. endp
  1320.  
  1321. dovolsl proc
  1322.   mov bl,[edi].chVolSlideVal
  1323.   mov al,[edi].chVol
  1324.   cmp [ebp].tick0,0
  1325.   jne @@done
  1326.   test bl,0f0h
  1327.   jnz @@up
  1328.     sub al,bl
  1329.     jnc @@done
  1330.       mov al,0
  1331.     jmp @@done
  1332. @@up:
  1333.     shr bl,4
  1334.     add al,bl
  1335.     cmp al,40h
  1336.     jbe @@done
  1337.       mov al,40h
  1338. @@done:
  1339.   mov [edi].chVol,al
  1340.   mov [edi].chFinalVol,al
  1341.   ret
  1342. endp
  1343.  
  1344. dovibvol proc
  1345.   call dovibrato
  1346.   jmp dovolsl
  1347. endp
  1348.  
  1349. doportavol proc
  1350.   call doportanote
  1351.   jmp dovolsl
  1352. endp
  1353.  
  1354. dogvolsl proc
  1355.   mov bl,[edi].chGVolSlideVal
  1356.   mov al,[ebp].globalvol
  1357.   cmp [ebp].tick0,0
  1358.   jne @@done
  1359.   test bl,0f0h
  1360.   jnz @@up
  1361.     sub al,bl
  1362.     jnc @@done
  1363.       mov al,0
  1364.     jmp @@done
  1365. @@up:
  1366.     shr bl,4
  1367.     add al,bl
  1368.     cmp al,40h
  1369.     jbe @@done
  1370.       mov al,40h
  1371. @@done:
  1372.   mov [ebp].globalvol,al
  1373.   ret
  1374. endp
  1375.  
  1376. dopansl proc
  1377.   mov bl,[edi].chPanSlideVal
  1378.   mov al,[edi].chPan
  1379.   cmp [ebp].tick0,0
  1380.   jne @@done
  1381.   test bl,0f0h
  1382.   jnz @@left
  1383.     add al,bl
  1384.     jnc @@done
  1385.       mov al,0ffh
  1386.     jmp @@done
  1387. @@left:
  1388.     shr bl,4
  1389.     sub al,bl
  1390.     jnc @@done
  1391.       mov al,0
  1392. @@done:
  1393.   mov [edi].chPan,al
  1394.   mov [edi].chFinalPan,al
  1395.   ret
  1396. endp
  1397.  
  1398. dokeyoff proc
  1399.   cmp [ebp].tick0,0
  1400.   jne @@done
  1401.   mov al,[ebp].curtick
  1402.   cmp al,[edi].chActionTick
  1403.   jne @@done
  1404.     mov [edi].chSustain,0
  1405. @@done:
  1406.   ret
  1407. endp
  1408.  
  1409. donotecut proc
  1410.   cmp [ebp].tick0,0
  1411.   jne @@done
  1412.   mov al,[ebp].curtick
  1413.   cmp al,[edi].chActionTick
  1414.   jne @@done
  1415.     mov [edi].chVol,0
  1416.     mov [edi].chFinalVol,0
  1417. @@done:
  1418.   ret
  1419. endp
  1420.  
  1421. doretrig proc
  1422.   cmp [edi].chActionTick,0
  1423.   je @@done
  1424.     movzx eax,[ebp].curtick
  1425.     div [edi].chActionTick
  1426.     cmp ah,0
  1427.     jne @@done
  1428.       mov [edi].chGUSNextPos,0
  1429. @@done:
  1430.   ret
  1431. endp
  1432.  
  1433. domretrig proc
  1434.   mov al,[edi].chMRetrigPos
  1435.   inc [edi].chMRetrigPos
  1436.   cmp al,[edi].chMRetrigLen
  1437.   jne @@done
  1438.     mov [edi].chMRetrigPos,0
  1439.     mov [edi].chGUSNextPos,0
  1440.  
  1441.     mov al,[edi].chVol
  1442.     mov bl,[edi].chMRetrigAct
  1443.     mov ah,128
  1444.     xchg bl,cl
  1445.     rol ah,cl
  1446.     xchg bl,cl
  1447.     test bl,7
  1448.     jz @@done
  1449.     test bl,8
  1450.     jnz @@up
  1451.     cmp bl,5
  1452.     ja @@nosub
  1453.       sub al,ah
  1454.   @@nosub:
  1455.     cmp bl,6
  1456.     jne @@not6
  1457.       mov ah,al
  1458.       shr al,2
  1459.       add al,ah
  1460.       shr al,1
  1461.   @@not6:
  1462.     cmp bl,7
  1463.     jne @@setvol
  1464.       shr al,1
  1465.     jmp @@setvol
  1466.  
  1467.   @@up:
  1468.     cmp bl,13
  1469.     ja @@noadd
  1470.       add al,ah
  1471.   @@noadd:
  1472.     cmp bl,14
  1473.     jne @@not14
  1474.       mov ah,al
  1475.       shr al,1
  1476.       add al,ah
  1477.   @@not14:
  1478.     cmp bl,15
  1479.     jne @@setvol
  1480.       shl al,1
  1481.       jns @@setvol
  1482.         dec al
  1483.  
  1484.   @@setvol:
  1485.     cmp al,0
  1486.     jge @@lok
  1487.       mov al,0
  1488.   @@lok:
  1489.     cmp al,40h
  1490.     jbe @@tok
  1491.       mov al,40h
  1492.   @@tok:
  1493.  
  1494.     mov [edi].chVol,al
  1495.     mov [edi].chFinalVol,al
  1496. @@done:
  1497.   ret
  1498. endp
  1499.  
  1500. dodelay proc
  1501.   cmp [ebp].tick0,0
  1502.   jne @@done
  1503.   mov al,[ebp].curtick
  1504.   cmp al,[edi].chActionTick
  1505.   jne @@done
  1506.     mov [ebp].notedelayed,1
  1507.     mov al,[edi].chDelayNote
  1508.     mov [ebp].procnot,al
  1509.     mov al,[edi].chCurIns
  1510.     mov [ebp].procins,al
  1511.     mov [ebp].proccmd,0ffh
  1512.     mov [ebp].procvol,0
  1513.     call PlayNote
  1514. @@done:
  1515.   ret
  1516. endp
  1517.  
  1518. dotremor proc
  1519.   mov al,[edi].chTremorPos
  1520.   cmp al,[edi].chTremorOff
  1521.   jb @@on
  1522.     mov [edi].chFinalVol,0
  1523. @@on:
  1524.   cmp [ebp].tick0,0
  1525.   jne @@done
  1526.   mov al,[edi].chTremorPos
  1527.   inc al
  1528.   cmp al,[edi].chTremorLen
  1529.   jb @@noloop
  1530.     xor al,al
  1531. @@noloop:
  1532.   mov [edi].chTremorPos,al
  1533. @@done:
  1534.   ret
  1535. endp
  1536.  
  1537.  
  1538.  
  1539. dovvolsld proc
  1540.   mov al,[edi].chVol
  1541.   cmp [ebp].tick0,0
  1542.   jne @@done
  1543.   sub al,[edi].chVVolPanSlideVal
  1544.   jnc @@done
  1545.     mov al,0
  1546. @@done:
  1547.   mov [edi].chVol,al
  1548.   mov [edi].chFinalVol,al
  1549.   ret
  1550. endp
  1551.  
  1552. dovvolslu proc
  1553.   mov al,[edi].chVol
  1554.   cmp [ebp].tick0,0
  1555.   jne @@done
  1556.   add al,[edi].chVVolPanSlideVal
  1557.   cmp al,40h
  1558.   jbe @@done
  1559.     mov al,40h
  1560. @@done:
  1561.   mov [edi].chVol,al
  1562.   mov [edi].chFinalVol,al
  1563.   ret
  1564. endp
  1565.  
  1566. dovpansll proc
  1567.   mov al,[edi].chPan
  1568.   cmp [ebp].tick0,0
  1569.   jne @@done
  1570.   sub al,[edi].chVVolPanSlideVal
  1571.   jnc @@done
  1572.     mov al,0
  1573. @@done:
  1574.   mov [edi].chPan,al
  1575.   mov [edi].chFinalPan,al
  1576.   ret
  1577. endp
  1578.  
  1579. dovpanslr proc
  1580.   mov al,[edi].chVol
  1581.   cmp [ebp].tick0,0
  1582.   jne @@done
  1583.   add al,[edi].chVVolPanSlideVal
  1584.   jnc @@done
  1585.     mov al,0ffh
  1586. @@done:
  1587.   mov [edi].chPan,al
  1588.   mov [edi].chFinalPan,al
  1589.   ret
  1590. endp
  1591.  
  1592. ;//***************************************************************************
  1593. ;//effects end
  1594.  
  1595. callproccmdtab proc
  1596.   call @@getadr
  1597. @@getadr:
  1598.   pop ebx
  1599.   mov eax,[ebx+proccmdtab[4*eax]-@@getadr]
  1600.   lea eax,[eax+ebx+procnothing-@@getadr]
  1601.   jmp eax
  1602. endp
  1603.  
  1604.  
  1605.  
  1606. PlayTick proc
  1607.   mov [ebp].tick0,0
  1608.   lea edi,[ebp].chandata
  1609.   xor ecx,ecx
  1610. @@resetvalloop:
  1611.     mov al,[edi].chVol
  1612.     mov [edi].chFinalVol,al
  1613.     mov al,[edi].chPan
  1614.     mov [edi].chFinalPan,al
  1615.     mov eax,[edi].chPitch
  1616.     mov [edi].chFinalPitch,eax
  1617.   add edi,channelsize
  1618.   inc ecx
  1619.   cmp ecx,[ebp].head.hdNChannels
  1620.   jne @@resetvalloop
  1621.  
  1622.   inc [ebp].curtick
  1623.   mov al,[ebp].curtick
  1624.   cmp al,[ebp].curtempo
  1625.   jne @@notnextrow
  1626.  
  1627.     mov [ebp].curtick,0
  1628.     cmp [ebp].patdelay,0
  1629.     jz @@nextrow
  1630.       dec [ebp].patdelay
  1631.       jmp @@notnextrow
  1632.   @@nextrow:
  1633.     mov [ebp].tick0,1
  1634.  
  1635.     inc [ebp].currow
  1636.     cmp [ebp].jumptoord,-1
  1637.     jne @@dojump
  1638.     mov eax,[ebp].currow
  1639.     cmp eax,[ebp].patlen
  1640.     jb @@donotjump
  1641.       mov eax,[ebp].curord
  1642.       inc eax
  1643.       mov [ebp].jumptoord,eax
  1644.       mov [ebp].jumptorow,0
  1645.   @@dojump:
  1646.  
  1647.       mov eax,[ebp].jumptoord
  1648.       cmp [ebp].curord,eax
  1649.       je @@noresetploop
  1650.         lea edi,[ebp].chandata
  1651.         xor ecx,ecx
  1652.       @@resetplloop:
  1653.           mov [edi].chPatLoopCount,0
  1654.           mov [edi].chPatLoopStart,0
  1655.           add edi,channelsize
  1656.         inc ecx
  1657.         cmp ecx,[ebp].head.hdNChannels
  1658.         jne @@resetplloop
  1659.     @@noresetploop:
  1660.  
  1661.       mov eax,[ebp].jumptoord
  1662.       cmp eax,[ebp].head.hdNOrders
  1663.       jb @@dontloop
  1664.         mov eax,[ebp].head.hdOrdLoopStart
  1665.     @@dontloop:
  1666.       mov [ebp].curord,eax
  1667.       mov eax,[ebp].jumptorow
  1668.       mov [ebp].currow,eax
  1669.       mov [ebp].jumptoord,-1
  1670.       mov eax,[ebp].curord
  1671.       movzx eax,[ebp].head.hdOrderTable[eax]
  1672.       mov esi,[ebp].head.hdPatternTable[4*eax]
  1673.       lodsd
  1674.       mov [ebp].patlen,eax
  1675.       cmp [ebp].jumptorow,0
  1676.       je @@rowfound
  1677.     @@rowfind:
  1678.       @@chanskip:
  1679.           lodsb
  1680.           cmp al,0
  1681.           je @@rowend
  1682.  
  1683.           test al,20h
  1684.           jz @@not20
  1685.             add esi,2
  1686.         @@not20:
  1687.           test al,40h
  1688.           jz @@not40
  1689.             inc esi
  1690.         @@not40:
  1691.           test al,80h
  1692.           jz @@chanskip
  1693.             add esi,2
  1694.           jmp @@chanskip
  1695.       @@rowend:
  1696.  
  1697.       dec [ebp].jumptorow
  1698.       jnz @@rowfind
  1699.     @@rowfound:
  1700.       mov [ebp].patptr,esi
  1701.   @@donotjump:
  1702.  
  1703.  
  1704.     mov esi,[ebp].patptr
  1705.     lea edi,[ebp].chandata
  1706.     xor ecx,ecx
  1707.   @@processrow:
  1708.       mov [ebp].procnot,0
  1709.       mov dword ptr [ebp].procins,0
  1710.       mov [edi].chCommand,0ffh
  1711.  
  1712.       mov al,[esi]
  1713.       cmp al,0
  1714.       je @@procnextchan
  1715.  
  1716.       and al,1fh
  1717.       cmp al,cl
  1718.       jne @@procnextchan
  1719.  
  1720.       lodsb
  1721.       mov ah,al
  1722.       test ah,20h
  1723.       jz @@nonot
  1724.         lodsb
  1725.         mov [ebp].procnot,al
  1726.         lodsb
  1727.         mov [ebp].procins,al
  1728.     @@nonot:
  1729.       test ah,40h
  1730.       jz @@novol
  1731.         lodsb
  1732.         mov [ebp].procvol,al
  1733.     @@novol:
  1734.       test ah,80h
  1735.       jz @@nocmd
  1736.         lodsb
  1737.         mov [ebp].proccmd,al
  1738.         lodsb
  1739.         mov [ebp].procdat,al
  1740.     @@nocmd:
  1741.     @@procnote:
  1742.       mov [ebp].notedelayed,0
  1743.       call PlayNote
  1744.  
  1745.       movzx eax,[ebp].procvol
  1746.       and [ebp].procvol,0fh
  1747.       shr eax,4
  1748.       mov [edi].chVCommand,al
  1749.       add eax,(procvoltab-proccmdtab)/4
  1750.       call callproccmdtab
  1751.  
  1752.       movzx eax,[ebp].proccmd
  1753.       cmp al,52
  1754.       jae @@procnextchan
  1755.         mov [edi].chCommand,al
  1756.         call callproccmdtab
  1757.  
  1758.     @@procnextchan:
  1759.       add edi,channelsize
  1760.     inc ecx
  1761.     cmp ecx,[ebp].head.hdNChannels
  1762.     jne @@processrow
  1763.     inc esi
  1764.     mov [ebp].patptr,esi
  1765.  
  1766. @@notnextrow:
  1767.  
  1768.   lea edi,[ebp].chandata
  1769.   xor ecx,ecx
  1770. @@dotickloop:
  1771. ;//process volume column
  1772.     movzx eax,[edi].chVCommand
  1773.     add eax,(dovoltab-proccmdtab)/4
  1774.     call callproccmdtab
  1775.  
  1776. ;//process command
  1777.     movzx eax,[edi].chCommand
  1778.     cmp al,52
  1779.     jae @@donocmd
  1780.       add eax,(docmdtab-proccmdtab)/4
  1781.       call callproccmdtab
  1782.   @@donocmd:
  1783.  
  1784.     mov ebx,[edi].chEnvIns
  1785.     cmp ebx,0
  1786.     je @@noenvins
  1787.  
  1788. ;//process fadeout
  1789.     movzx eax,[edi].chFinalVol
  1790.     mul [ebp].uservol
  1791.     shr eax,6
  1792.     mul [ebp].globalvol
  1793.     mul [edi].chFadeVol
  1794.     shr edx,4
  1795.     mov [edi].chFinalVol,dl
  1796.  
  1797.     cmp [edi].chSustain,0
  1798.     jne @@sustain
  1799.       mov ax,[ebx].insVolFade
  1800.       sub [edi].chFadeVol,ax
  1801.       jnb @@sustain
  1802.         mov [edi].chFadeVol,0
  1803.   @@sustain:
  1804.  
  1805. ;//process volume envelope
  1806.     mov eax,[edi].chVolEnvPos
  1807.     cmp [edi].chVolEnvSegPos,0
  1808.     je @@vnoloop
  1809.     cmp al,[ebx].insVLoopE
  1810.     jne @@vnoloop
  1811.       mov al,[ebx].insVLoopS
  1812.       mov [edi].chVolEnvPos,eax
  1813.   @@vnoloop:
  1814.     lea esi,[ebx].insVEnv[4*eax]
  1815.     cmp al,[ebx].insVNum
  1816.     je @@venvlast
  1817.       mov ax,[esi][4][2]
  1818.       mov dx,[esi][0][2]
  1819.       sub eax,edx
  1820.       imul [edi].chVolEnvSegPos
  1821.       idiv word ptr [esi][0][0]
  1822.       add al,byte ptr [esi][0][2]
  1823.       mul [edi].chFinalVol
  1824.       shr eax,6
  1825.       mov [edi].chFinalVol,al
  1826.  
  1827.       mov ax,[edi].chVolEnvSegPos
  1828.       cmp ax,0
  1829.       jne @@vnosustain
  1830.       cmp [edi].chSustain,0
  1831.       je @@vnosustain
  1832.         mov edx,[edi].chVolEnvPos
  1833.         cmp dl,[ebx].insVSustain
  1834.         je @@venvnostep
  1835.     @@vnosustain:
  1836.       inc eax
  1837.       cmp ax,[esi][0][0]
  1838.       jb @@venvnostep
  1839.         xor eax,eax
  1840.         inc [edi].chVolEnvPos
  1841.     @@venvnostep:
  1842.       mov [edi].chVolEnvSegPos,ax
  1843.       jmp @@venvend
  1844.  
  1845.   @@venvlast:
  1846.       mov al,byte ptr [esi][0][2]
  1847.       mul [edi].chFinalVol
  1848.       shr eax,6
  1849.       mov [edi].chFinalVol,al
  1850.   @@venvend:
  1851.  
  1852. ;//process panning envelope
  1853.     mov eax,[edi].chPanEnvPos
  1854.     cmp [edi].chPanEnvSegPos,0
  1855.     je @@pnoloop
  1856.     cmp al,[ebx].insPLoopE
  1857.     jne @@pnoloop
  1858.       mov al,[ebx].insPLoopS
  1859.       mov [edi].chPanEnvPos,eax
  1860.   @@pnoloop:
  1861.     lea esi,[ebx].insPEnv[4*eax]
  1862.     cmp al,[ebx].insPNum
  1863.     je @@penvlast
  1864.       mov ax,[esi][4][2]
  1865.       mov dx,[esi][0][2]
  1866.       sub eax,edx
  1867.       imul [edi].chPanEnvSegPos
  1868.       idiv byte ptr [esi][0][0]
  1869.       add al,byte ptr [esi][0][2]
  1870.       sub al,32
  1871.       movsx edx,[edi].chFinalPan
  1872.       xor dl,dh
  1873.       imul dl
  1874.       shr eax,5
  1875.       add [edi].chFinalPan,al
  1876.  
  1877.       mov ax,[edi].chPanEnvSegPos
  1878.       cmp ax,0
  1879.       jne @@pnosustain
  1880.       cmp [edi].chSustain,0
  1881.       je @@pnosustain
  1882.         mov edx,[edi].chPanEnvPos
  1883.         cmp dl,[ebx].insPSustain
  1884.         je @@penvnostep
  1885.     @@pnosustain:
  1886.       inc eax
  1887.       cmp ax,[esi][0][0]
  1888.       jb @@penvnostep
  1889.         xor eax,eax
  1890.         inc [edi].chPanEnvPos
  1891.     @@penvnostep:
  1892.       mov [edi].chPanEnvSegPos,ax
  1893.       jmp @@penvend
  1894.  
  1895.   @@penvlast:
  1896.       mov al,byte ptr [esi][0][2]
  1897.       sub al,32
  1898.       movsx edx,[edi].chFinalPan
  1899.       xor dl,dh
  1900.       imul dl
  1901.       shr eax,5
  1902.       add [edi].chFinalPan,al
  1903.   @@penvend:
  1904.  
  1905. ;//process auto vibrato
  1906.     movzx eax,[edi].chAVibPos
  1907.     mov ah,[ebx].insVibType
  1908.     mov al,[ebp].vibtabs[eax]
  1909.     imul [ebx].insVibDepth
  1910.     shr eax,4
  1911.  
  1912.     mov dl,[edi].chAVibSwpPos
  1913.     cmp dl,[ebx].insVibSweep
  1914.     jae @@nosweep
  1915.       imul dl
  1916.       idiv [ebx].insVibSweep
  1917.       inc [edi].chAVibSwpPos
  1918.   @@nosweep:
  1919.  
  1920.     neg eax
  1921.     movsx eax,al
  1922.     add eax,[edi].chFinalPitch
  1923.     call freqrange
  1924.     mov [edi].chFinalPitch,eax
  1925.  
  1926.     mov al,[ebx].insVibRate
  1927.     add [edi].chAVibPos,al
  1928.   @@noenvins:
  1929.  
  1930. ;//conv vals for gus
  1931.     movzx eax,[edi].chFinalVol
  1932.     shl eax,1
  1933.     mov ax,[ebp].guslinvol[2*eax]
  1934.     mov [edi].chGUSVol,ax
  1935.  
  1936.     mov al,[edi].chFinalPan
  1937.     shr al,4
  1938.     mov [edi].chGUSPan,al
  1939.  
  1940.     mov eax,[edi].chFinalPitch
  1941.     test byte ptr [ebp].head.hdOptions,1
  1942.     jz @@amiga
  1943.       call getfreq6848
  1944.       mul [ebp].guschannels
  1945.       mov ebx,494
  1946.       div ebx
  1947.       jmp @@noamiga
  1948.   @@amiga:
  1949.       cmp eax,100
  1950.       jb @@noamiga
  1951.       mov ebx,eax
  1952.       mov eax,94929
  1953.       mul [ebp].guschannels
  1954.       div ebx
  1955.   @@noamiga:
  1956.  
  1957.     and al,not 1
  1958.     mov [edi].chGUSFrq,ax
  1959.  
  1960.   add edi,channelsize
  1961.   inc ecx
  1962.   cmp ecx,[ebp].head.hdNChannels
  1963.   jne @@dotickloop
  1964.  
  1965.   ret
  1966. endp
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972. public xmpPlay_
  1973. xmpPlay_ proc
  1974.   push ebp
  1975.   call loadebp
  1976.  
  1977.   mov [ebp].jumptoord,eax
  1978.   mov [ebp].curord,eax
  1979.   xor eax,eax
  1980.   mov [ebp].currow,eax
  1981.  
  1982.   call gusOpen
  1983.  
  1984.   lea edi,[ebp].chandata
  1985.   mov ecx,channelsize*8
  1986.   xor eax,eax
  1987.   rep stosd
  1988.  
  1989.   lea edi,[ebp].chandata
  1990.   xor ecx,ecx
  1991. @@panloop:
  1992.     mov al,[ebp].head.hdPanPos[ecx]
  1993.     mov [edi].chPan,al
  1994.     add edi,channelsize
  1995.   inc ecx
  1996.   cmp cl,32
  1997.   jne @@panloop
  1998.  
  1999.   xor eax,eax
  2000.   mov [ebp].globalvol,40h
  2001.   mov [ebp].jumptorow,eax
  2002.   mov [ebp].syncval,al
  2003.  
  2004.   mov al,[ebp].head.hdIniTempo
  2005.   mov [ebp].curtempo,al
  2006.   dec al
  2007.   mov [ebp].curtick,al
  2008.  
  2009.   mov eax,2983615
  2010.   xor edx,edx
  2011.   movzx ebx,[ebp].head.hdIniBPM
  2012.   div ebx
  2013.   mov [ebp].stimerlen,eax
  2014.   call tmInit
  2015.   pop ebp
  2016.   ret
  2017. endp
  2018.  
  2019. public xmpStop_
  2020. xmpStop_ proc
  2021.   push ebp
  2022.   call loadebp
  2023.   call tmClose
  2024.   call gusClose
  2025.   pop ebp
  2026.   ret
  2027. endp
  2028.  
  2029.  
  2030.  
  2031. ;//*************************************************************************
  2032. ;// system timer
  2033.  
  2034.  
  2035.  
  2036. tmTimerHandler proc
  2037.   pushad
  2038.   push ds
  2039.   push es
  2040.   push fs
  2041.   push gs
  2042.  
  2043.   call loadebp
  2044.   mov esi,ebp
  2045.  
  2046.   cld
  2047.   mov ds,cs:[esi].datasegsel
  2048.   mov es,[esi].datasegsel
  2049.  
  2050.   mov eax,[esi].tmTimerRate
  2051.   add [esi].tmTicker,eax
  2052.  
  2053.   add [esi].tmIntCount,eax
  2054.   cmp byte ptr [esi].tmIntCount+2,0
  2055.   je @@noorgcall
  2056.     mov byte ptr [esi].tmIntCount+2,0
  2057.     pushfd
  2058.     call [esi].tmOldTimer
  2059. @@noorgcall:
  2060.  
  2061.   mov al,20h
  2062.   out 20h,al
  2063.  
  2064.   mov ebx,[esi].maxtimerrate
  2065.   mov ecx,[esi].stimerlen
  2066.   mov edx,[esi].stimerpos
  2067.  
  2068.   sub edx,ebx
  2069.   ja @@another
  2070.     mov edx,ecx
  2071. @@another:
  2072.  
  2073.   mov [esi].stimerpos,edx
  2074.  
  2075.   cmp edx,ebx
  2076.   jb @@intervalok
  2077.     mov edx,ebx
  2078. @@intervalok:
  2079.   mov [esi].tmTimerRate,edx
  2080.   mov al,34h
  2081.   out 43h,al
  2082.   mov al,dl
  2083.   out 40h,al
  2084.   mov al,dh
  2085.   out 40h,al
  2086.  
  2087.   cmp [esi].stimerpos,ecx
  2088.   jne @@notick
  2089.   cmp [esi].tmInRoutine,0
  2090.   jnz @@notick
  2091.     mov [esi].tmInRoutine,1
  2092.     mov dword ptr [esi].tmOldSSESP,esp
  2093.     mov word ptr [esi].tmOldSSESP+4,ss
  2094.     push ds
  2095.     pop ss
  2096.     lea esp,[esi].tmStack+1024
  2097.     sti
  2098.     call gusPlayTick
  2099.     call PlayTick
  2100.     cli
  2101.     lss esp,[ebp].tmOldSSESP
  2102.     mov ds:[ebp].tmInRoutine,0
  2103. @@notick:
  2104.  
  2105.   pop gs
  2106.   pop fs
  2107.   pop es
  2108.   pop ds
  2109.   popad
  2110.   iretd
  2111. endp
  2112.  
  2113.  
  2114.  
  2115.  
  2116. tmInit proc
  2117.   mov [ebp].datasegsel,ds
  2118.  
  2119.   xor eax,eax
  2120.   mov [ebp].stimerpos,eax
  2121.   mov [ebp].tmIntCount,eax
  2122.   mov [ebp].tmInRoutine,0
  2123.   mov [ebp].tmTimerRate,65536
  2124.   mov eax,-65536
  2125.   sub eax,[ebp].stimerlen
  2126.   mov [ebp].tmTicker,eax
  2127.  
  2128.  
  2129.  
  2130.   mov ah,Get_Irq
  2131.   mov bx,0
  2132.   Int_EOS
  2133.   mov dword ptr [ebp].tmOldTimer+0,edx
  2134.   mov word ptr [ebp].tmOldTimer+4,cx
  2135.  
  2136.   mov ah,Set_Irq
  2137.   mov bx,0
  2138.   push ds
  2139.   call @@getadr
  2140. @@getadr:
  2141.   pop edx
  2142.   add edx,tmTimerHandler-@@getadr
  2143.   mov cx,cs
  2144.   Int_EOS
  2145.   pop ds
  2146.  
  2147.   mov al,34h
  2148.   out 43h,al
  2149.   mov eax,[ebp].tmTimerRate
  2150.   out 40h,al
  2151.   mov al,ah
  2152.   out 40h,al
  2153.   ret
  2154. endp
  2155.  
  2156.  
  2157. tmClose proc
  2158.   mov ah,Set_Irq
  2159.   mov bx,0
  2160.   mov edx,dword ptr [ebp].tmOldTimer+0
  2161.   mov cx,word ptr [ebp].tmOldTimer+4
  2162.   Int_EOS
  2163.  
  2164.  
  2165.   mov al,34h
  2166.   out 43h,al
  2167.   xor al,al
  2168.   out 40h,al
  2169.   out 40h,al
  2170.   ret
  2171. endp
  2172.  
  2173. public xmpGetTimer_
  2174. xmpGetTimer_ proc
  2175.   pushf
  2176.   xor eax,eax
  2177.   cli
  2178.   out 43h,al
  2179.   in al,40h
  2180.   mov ah,al
  2181.   in al,40h
  2182.   popf
  2183.   xchg ah,al
  2184.   neg eax
  2185.   push ebp
  2186.   call loadebp
  2187.   add eax,[ebp].tmTimerRate
  2188.   add eax,[ebp].tmTicker
  2189.   pop ebp
  2190.   ret
  2191. endp
  2192.  
  2193.  
  2194.  
  2195.  
  2196.  
  2197. ;//*************************************************************************
  2198. ;// GUS
  2199.  
  2200. gusoutp proc
  2201.   add edx,[ebp].gusport
  2202.   out dx,al
  2203.   sub edx,[ebp].gusport
  2204.   ret
  2205. endp
  2206.  
  2207. gusout proc
  2208.             push edx
  2209.   mov dx,103h
  2210.   xchg al,bl
  2211.   call gusoutp
  2212.   add dl,2
  2213.   xchg al,bl
  2214.   call gusoutp
  2215.             pop edx
  2216.   ret
  2217. endp
  2218.  
  2219. gusoutd proc
  2220.             push edx
  2221.   mov dx,103h
  2222.   xchg al,bl
  2223.   call gusoutp
  2224.   add dl,2
  2225.   xchg al,bl
  2226.   call gusoutp
  2227.   call gusdelay
  2228.   call gusoutp
  2229.             pop edx
  2230.   ret
  2231. endp
  2232.  
  2233. gusoutw proc
  2234.             push edx
  2235.   mov dx,103h
  2236.   xchg al,bl
  2237.   call gusoutp
  2238.   inc edx
  2239.   xchg al,bl
  2240.   add edx,[ebp].gusport
  2241.   out dx,ax
  2242.             pop edx
  2243.   ret
  2244. endp
  2245.  
  2246. gusin proc
  2247.             push edx
  2248.   mov dx,103h
  2249.   xchg al,bl
  2250.   call gusoutp
  2251.   add dl,2
  2252.   xchg al,bl
  2253.   add edx,[ebp].gusport
  2254.   in al,dx
  2255.             pop edx
  2256.   ret
  2257. endp
  2258.  
  2259. gusinw proc
  2260.             push edx
  2261.   mov dx,103h
  2262.   xchg al,bl
  2263.   call gusoutp
  2264.   inc edx
  2265.   xchg al,bl
  2266.   add edx,[ebp].gusport
  2267.   in ax,dx
  2268.             pop edx
  2269.   ret
  2270. endp
  2271.  
  2272. gusdelay proc
  2273.             push eax
  2274.             push edx
  2275.   mov dx,107h
  2276.   add edx,[ebp].gusport
  2277.   in al,dx
  2278.   in al,dx
  2279.   in al,dx
  2280.   in al,dx
  2281.   in al,dx
  2282.   in al,dx
  2283.   in al,dx
  2284.             pop edx
  2285.             pop eax
  2286.   ret
  2287. endp
  2288.  
  2289. gusselchn proc
  2290.             push edx
  2291.   mov dx,102h
  2292.   xchg al,cl
  2293.   call gusoutp
  2294.   xchg al,cl
  2295.             pop edx
  2296.   ret
  2297. endp
  2298.  
  2299.  
  2300. gussetpoint proc
  2301.             push eax
  2302.   shr eax,7
  2303.   and eax,1FFFh
  2304.   call gusoutw
  2305.   mov eax,[esp]
  2306.   inc bl
  2307.   shl eax,9
  2308.   call gusoutw
  2309.   dec bl
  2310.             pop eax
  2311.   ret
  2312. endp
  2313.  
  2314. gusopenchan proc
  2315.   cmp al,14
  2316.   jae @@chanok
  2317.     mov al,14
  2318. @@chanok:
  2319.   mov [ebp].guschannels,eax
  2320.  
  2321.   mov bl,04ch
  2322.   mov al,0
  2323.   call gusout
  2324.   call gusdelay
  2325.   call gusdelay
  2326.   inc al
  2327.   call gusout
  2328.   call gusdelay
  2329.   call gusdelay
  2330.  
  2331.   mov bl,0eh
  2332.   mov al,byte ptr [ebp].guschannels
  2333.   dec al
  2334.   or al,0c0h
  2335.   call gusout
  2336.  
  2337.   xor ecx,ecx
  2338. @@initloop:
  2339.     call gusselchn
  2340.     xor ax,ax
  2341.     mov bl,9
  2342.     call gusoutw
  2343.     mov al,3
  2344.     mov bl,0
  2345.     call gusoutd
  2346.     mov al,3
  2347.     mov bl,0dh
  2348.     call gusoutd
  2349.     mov al,3fh
  2350.     mov bl,6
  2351.     call gusout
  2352.     call gusdelay
  2353.   inc ecx
  2354.   cmp ecx,32
  2355.   jne @@initloop
  2356.  
  2357.   mov bl,4ch
  2358.   mov al,7
  2359.   call gusout
  2360.  
  2361.   mov cl,0
  2362.   call gusselchn
  2363.   xor edx,edx
  2364.   mov al,8
  2365.   call gusoutp
  2366.   ret
  2367. endp
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374. gusfadevol proc
  2375.   mov bl,89h
  2376.   call gusinw
  2377.   movzx eax,ax
  2378.   mov bl,0
  2379.   cmp eax,edx
  2380.   jbe @@up
  2381.     xchg eax,edx
  2382.     mov bl,40h
  2383. @@up:
  2384.  
  2385.   sub edx,eax
  2386.   jz @@done
  2387.   cmp edx,4096
  2388.   jae @@normfade
  2389.     cmp bl,40h
  2390.     je @@swapped
  2391.       add eax,edx
  2392.   @@swapped:
  2393.     mov bl,9
  2394.     call gusoutw
  2395.     jmp @@done
  2396.  
  2397. @@normfade:
  2398.   add edx,eax
  2399.  
  2400.   cmp eax,4096
  2401.   jae @@stok
  2402.     mov eax,4096
  2403. @@stok:
  2404.   cmp edx,64512
  2405.   jbe @@eok
  2406.     mov edx,64512
  2407. @@eok:
  2408.  
  2409.   push ebx
  2410.   mov al,ah
  2411.   mov bl,7
  2412.   call gusout
  2413.   mov al,dh
  2414.   mov bl,8
  2415.   call gusout
  2416.   pop eax
  2417.   mov bl,0dh
  2418.   call gusoutd
  2419.  
  2420. @@done:
  2421.   ret
  2422. endp
  2423.  
  2424. gusfadevoldown proc
  2425.             push eax
  2426.             push ebx
  2427.   mov bl,07h
  2428.   mov al,04h
  2429.   call gusout
  2430.   mov bl,08h
  2431.   mov al,0fch
  2432.   call gusout
  2433.   mov bl,0dh
  2434.   mov al,40h
  2435.   call gusoutd
  2436.             pop ebx
  2437.             pop eax
  2438.   ret
  2439. endp
  2440.  
  2441.  
  2442. gusPlayTick proc
  2443.   cmp [ebp].gusport,0
  2444.   je @@nogus
  2445.  
  2446.   lea edi,[ebp].chandata
  2447.   xor ecx,ecx
  2448. @@clearloop:
  2449.     cmp [edi].chGUSInited,0
  2450.     je @@nostop
  2451.     cmp [edi].chGUSStopIt,0
  2452.     je @@nostop
  2453.       call gusselchn
  2454.       mov bl,0
  2455.       mov al,[edi].chGUSMode
  2456.       or al,3
  2457.       call gusoutd
  2458.       call gusfadevoldown
  2459.       mov [edi].chGUSStopIt,0
  2460.   @@nostop:
  2461.   add edi,channelsize
  2462.   inc ecx
  2463.   cmp ecx,[ebp].head.hdNChannels
  2464.   jne @@clearloop
  2465.  
  2466.   xor ecx,ecx
  2467. @@waitloop:
  2468.     call gusselchn
  2469.     mov bl,8dh
  2470.   @@dowait:
  2471.       call gusin
  2472.       test al,1
  2473.     jz @@dowait
  2474.   inc ecx
  2475.   cmp ecx,[ebp].head.hdNChannels
  2476.   jne @@waitloop
  2477.  
  2478.   lea edi,[ebp].chandata
  2479.   xor ecx,ecx
  2480. @@playloop:
  2481.     call gusselchn
  2482.     cmp [edi].chGUSInited,0
  2483.     je @@quiet
  2484.       cmp [edi].chGUSChangeSamp,0
  2485.       je @@samesample
  2486.         mov bl,2
  2487.         mov eax,[edi].chGUSLoopPos
  2488.         call gussetpoint
  2489.         mov bl,4
  2490.         mov eax,[edi].chGUSEndPos
  2491.         call gussetpoint
  2492.     @@samesample:
  2493.  
  2494.       cmp [edi].chGUSNextPos,-1
  2495.       je @@noposchange
  2496.         mov eax,[edi].chGUSNextPos
  2497.         add eax,[edi].chGUSStartPos
  2498.  
  2499.         cmp eax,[edi].chGUSEndPos
  2500.         jb @@posok
  2501.           mov eax,[edi].chGUSEndPos
  2502.           dec eax
  2503.       @@posok:
  2504.         mov bl,10
  2505.         call gussetpoint
  2506.         mov bl,80h
  2507.         call gusin
  2508.         mov bl,0
  2509.         and al,40h
  2510.         or al,[edi].chGUSMode
  2511.         call gusout
  2512.  
  2513.     @@noposchange:
  2514.       mov bl,80h
  2515.       call gusin
  2516.       test bl,1
  2517.       jnz @@quiet
  2518.         mov bl,0ch
  2519.         mov al,[edi].chGUSPan
  2520.         call gusout
  2521.         mov bl,1
  2522.         mov ax,[edi].chGUSFrq
  2523.         call gusoutw
  2524.         movzx edx,[edi].chGUSVol
  2525.         call gusfadevol
  2526.       jmp @@nextchan
  2527.  
  2528.   @@quiet:
  2529.       call gusfadevoldown
  2530.  
  2531.   @@nextchan:
  2532.     mov [edi].chGUSChangeSamp,0
  2533.     mov [edi].chGUSNextPos,-1
  2534.   add edi,channelsize
  2535.   inc ecx
  2536.   cmp ecx,[ebp].head.hdNChannels
  2537.   jne @@playloop
  2538.  
  2539. @@nogus:
  2540.   ret
  2541. endp
  2542.  
  2543.  
  2544. gusOpen proc
  2545.   cmp [ebp].gusport,0
  2546.   je @@nogus
  2547.   mov eax,[ebp].head.hdNChannels
  2548.   call gusopenchan
  2549.   mov cl,0
  2550.   call gusselchn
  2551.   xor edx,edx
  2552.   mov al,9
  2553.   call gusoutp
  2554. @@nogus:
  2555.   ret
  2556. endp
  2557.  
  2558. gusClose proc
  2559.   cmp [ebp].gusport,0
  2560.   je @@nogus
  2561.   mov eax,14
  2562.   call gusopenchan
  2563. @@nogus:
  2564.   ret
  2565. endp
  2566.  
  2567.  
  2568. gusUploadSamples proc
  2569.   cmp [ebp].gusport,0
  2570.   je @@done
  2571.   shr ecx,4
  2572.   jz @@done
  2573.   xor ebx,ebx
  2574.  
  2575. @@bigloop:
  2576.     pushf
  2577.     cli
  2578.     mov edx,[ebp].gusport
  2579.     add dx,103h
  2580.     mov al,44h
  2581.     out dx,al
  2582.     add dl,2
  2583.     mov eax,ebx
  2584.     shr eax,16
  2585.     out dx,al
  2586.     sub dl,2
  2587.     mov al,43h
  2588.     out dx,al
  2589.     inc dl
  2590.     cli
  2591.   @@loop:
  2592.       mov eax,ebx
  2593.       out dx,ax
  2594.       lodsb
  2595.       add dl,3
  2596.       out dx,al
  2597.       sub dl,3
  2598.       inc ebx
  2599.     test bl,0fh
  2600.     jnz @@loop
  2601.     popf
  2602.   dec ecx
  2603.   jnz @@bigloop
  2604. @@done:
  2605.   ret
  2606. endp
  2607.  
  2608. gusGetPort proc
  2609.    mov edi,[Environment_Addr]
  2610.    xor eax,eax
  2611.    xor ecx,ecx
  2612.    dec ecx
  2613.    jmp @@scanentry
  2614. @@envscan:
  2615.     repne scasb
  2616.   @@scanentry:
  2617.     cmp byte ptr [edi],0
  2618.     je @@done
  2619.     cmp dword ptr [edi],52544C55h
  2620.     jne @@envscan
  2621.     cmp dword ptr [edi+4],444E5341h
  2622.     jne @@envscan
  2623.     cmp word ptr [edi+8],323Dh
  2624.     jne @@envscan
  2625.     cmp word ptr [edi+11],2C30h
  2626.     jne @@envscan
  2627.     mov al,byte ptr [edi+10]
  2628.     sub al,30h
  2629.     shl al,4
  2630.     mov ah,2
  2631. @@done:
  2632.     ret
  2633. endp
  2634.  
  2635. sintab db 0,2,3,5,6,8,9,11,12,14,16,17,19,20,22,23,24,26,27,29,30,32,33
  2636.        db 34,36,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
  2637.        db 56,57,58,59,59,60,60,61,61,62,62,62,63,63,63,64,64,64,64,64
  2638. logfreqtab dw 32768,32761,32753,32746,32738,32731,32724,32716,32709,32702,32694,32687,32679,32672,32665,32657
  2639.            dw 32768,32650,32532,32415,32298,32182,32066,31950,31835,31720,31606,31492,31379,31266,31153,31041
  2640.            dw 32768,30929,29193,27554,26008,24548,23170,21870,20643,19484,18390,17358,16384,15464,14596,13777
  2641.            dd 11131415,4417505,1753088,695713,276094,109568,43482,17256,6848,2718,1078,428,170,67,27,11
  2642.  
  2643. proccmdtab label dword
  2644.   dd procarpeggio-procnothing
  2645.   dd procportau-procnothing
  2646.   dd procportad-procnothing
  2647.   dd procportanote-procnothing
  2648.   dd procvibrato-procnothing
  2649.   dd procvolsl-procnothing
  2650.   dd procvolsl-procnothing
  2651.   dd proctremolo-procnothing
  2652.   dd procpan-procnothing
  2653.   dd 0
  2654.   dd procvolsl-procnothing
  2655.   dd procjump-procnothing
  2656.   dd procnvol-procnothing
  2657.   dd procbreak-procnothing
  2658.   dd 0
  2659.   dd proctempo-procnothing
  2660.   dd procgvol-procnothing
  2661.   dd procgvolsl-procnothing
  2662.   dd 0
  2663.   dd 0
  2664.   dd proctick-procnothing
  2665.   dd procenvpos-procnothing
  2666.   dd 0
  2667.   dd 0
  2668.   dd 0
  2669.   dd procpansl-procnothing
  2670.   dd 0
  2671.   dd procmretrig-procnothing
  2672.   dd procsync-procnothing
  2673.   dd proctremor-procnothing
  2674.   dd 0
  2675.   dd 0
  2676.   dd 0
  2677.   dd procxfporta-procnothing
  2678.   dd 0
  2679.   dd 0
  2680.  
  2681.   dd 0
  2682.   dd procfportau-procnothing
  2683.   dd procfportad-procnothing
  2684.   dd procgliss-procnothing
  2685.   dd procvibtype-procnothing
  2686.   dd 0
  2687.   dd procpatloop-procnothing
  2688.   dd proctremtype-procnothing
  2689.   dd procspan-procnothing
  2690.   dd proctick-procnothing
  2691.   dd procfvolup-procnothing
  2692.   dd procfvoldn-procnothing
  2693.   dd proctick-procnothing
  2694.   dd proctick-procnothing
  2695.   dd procpatdelay-procnothing
  2696.   dd procsync-procnothing
  2697.  
  2698. procvoltab label dword
  2699.   dd 0
  2700.   dd procvvol0-procnothing
  2701.   dd procvvol1-procnothing
  2702.   dd procvvol2-procnothing
  2703.   dd procvvol3-procnothing
  2704.   dd procvvol4-procnothing
  2705.   dd procvvpsl-procnothing
  2706.   dd procvvpsl-procnothing
  2707.   dd procvfvoldn-procnothing
  2708.   dd procvfvolup-procnothing
  2709.   dd procvvibrat-procnothing
  2710.   dd procvvib-procnothing
  2711.   dd procvpan-procnothing
  2712.   dd procvvpsl-procnothing
  2713.   dd procvvpsl-procnothing
  2714.   dd procvportanote-procnothing
  2715.  
  2716.  
  2717. docmdtab label dword
  2718.   dd doarpeggio-procnothing
  2719.   dd doportau-procnothing
  2720.   dd doportad-procnothing
  2721.   dd doportanote-procnothing
  2722.   dd dovibrato-procnothing
  2723.   dd doportavol-procnothing
  2724.   dd dovibvol-procnothing
  2725.   dd dotremolo-procnothing
  2726.   dd 0
  2727.   dd 0
  2728.   dd dovolsl-procnothing
  2729.   dd 0
  2730.   dd 0
  2731.   dd 0
  2732.   dd 0
  2733.   dd 0
  2734.   dd 0
  2735.   dd dogvolsl-procnothing
  2736.   dd 0
  2737.   dd 0
  2738.   dd dokeyoff-procnothing
  2739.   dd 0
  2740.   dd 0
  2741.   dd 0
  2742.   dd 0
  2743.   dd dopansl-procnothing
  2744.   dd 0
  2745.   dd domretrig-procnothing
  2746.   dd 0
  2747.   dd dotremor-procnothing
  2748.   dd 0
  2749.   dd 0
  2750.   dd 0
  2751.   dd 0
  2752.   dd 0
  2753.   dd 0
  2754.  
  2755.   dd 0
  2756.   dd 0
  2757.   dd 0
  2758.   dd 0
  2759.   dd 0
  2760.   dd 0
  2761.   dd 0
  2762.   dd 0
  2763.   dd 0
  2764.   dd doretrig-procnothing
  2765.   dd 0
  2766.   dd 0
  2767.   dd donotecut-procnothing
  2768.   dd dodelay-procnothing
  2769.   dd 0
  2770.   dd 0
  2771.  
  2772. dovoltab label dword
  2773.   dd 0
  2774.   dd 0
  2775.   dd 0
  2776.   dd 0
  2777.   dd 0
  2778.   dd 0
  2779.   dd dovvolsld-procnothing
  2780.   dd dovvolslu-procnothing
  2781.   dd 0
  2782.   dd 0
  2783.   dd 0
  2784.   dd dovibrato-procnothing
  2785.   dd 0
  2786.   dd dovpansll-procnothing
  2787.   dd dovpanslr-procnothing
  2788.   dd doportanote-procnothing
  2789.  
  2790.  
  2791.